package com.scott.ch070;

/**
 * @author 黄后林
 * @version 1.0
 * @note 线性表中的 顺序表
 * @date 2022-03-13 12:15:43
 */
public class SequenceList<T> {

    // 存储元素的数组
    private T[] elements;

    // 当前数组中已有的元素的个数   counter=计数器
    private int counter;

    // 初始化数组elements的长度
    public SequenceList(int capacity){

        // 强转
        this.elements= (T[]) new Object[capacity];

        //开始的时候1个元素也没有
        this.counter=0;

    }

    // 清除数组中的所有元素 将1个线性表置为空表
    public void clear(){
        // 只是做了标记 并没有实际删除元素
        this.counter=0;

    }

    // 判断当前线性表中是否有元素 如果1个元素也没有返回true 否则返回false
    public boolean isEmpty(){
        return this.counter==0;
    }

    // 获取线性表的长度
    public int length(){
        return this.counter;
    }

    // 获取指定下标处的元素
    public T get(int index){
        return this.elements[index];
    }

    // 向线性表的末尾添加元素
    public void insert(T t){

        this.elements[counter]=t;
        counter++;

    }

    // 在数组指定的下标index处添加元素
    public void insert(int i,T t){

        //1 把index下标处的元素及其后面的元素都向后移动1位
        for(int index=counter-1;index>i;index--){
            this.elements[index]=this.elements[index-1];
        }

        //2 再把t元素放到下标index处
        this.elements[i]=t;

    }

    // 删除指定下标处的元素、并返回该元素
    public T remove(int index){

        // 1、记录下标index处的值
        T rs = this.elements[index];

        // 2、索引i处的元素都向前移动1位
        for(int i =index;i<this.counter-1;index++){
            this.elements[i]=this.elements[i+1];
        }

        // 3、数组元素的个数减1
        this.counter--;

        return rs;

    }

    // 查找第一次出现指定元素t的下标 如果没有t则返回-1
    public int indexOf(T t){

        for(int index=0;index<=this.counter-1;index++){
            T tmp= this.elements[index];
            if(tmp.equals(t)){
                return index;
            }
        }
        return -1;
    }






}
